package com.eltsistemas.controller.rescisao;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import org.hibernate.Session;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.SessionAttributes;

import com.eltsistemas.dao.AutorizacaoDao;
import com.eltsistemas.dao.GenericDao;
import com.eltsistemas.hibernate.HibernateUtil;
import com.eltsistemas.modelo.Autorizacao;
import com.eltsistemas.modelo.Autorizacao_Desligamento;
import com.eltsistemas.modelo.Desligamento;
import com.eltsistemas.modelo.Funcionario;
import com.eltsistemas.modelo.Usuario;

@Controller
@SessionAttributes(value="usuario_Logado")
@RequestMapping(value="/rescisao")
public class RescisaoAutorizacao {
	
	@RequestMapping(value="/autorizacao")
	@ResponseBody
	public List<Autorizacao_Desligamento> exibe(Desligamento desligamento)
	{
		//Iniciando conexao a abrindo uma transacao
		Session session = new HibernateUtil().getSession();
		
		GenericDao<Desligamento> daoDesligamento = new GenericDao<>(session, Desligamento.class);
		Desligamento d = daoDesligamento.findById(desligamento.getId());
		
		AutorizacaoDao daoAutorizacao = new AutorizacaoDao(session);
		
		List<Autorizacao_Desligamento> aut_Desligamento_Aux = new ArrayList<>();
		
		List<Autorizacao_Desligamento> aut_DesligamentoList = daoAutorizacao.autorizacao_DesligamentoList(d);
		for(Autorizacao_Desligamento aut_Desligamento : aut_DesligamentoList)
		{
			Autorizacao_Desligamento autorizacao_Desligamento = new Autorizacao_Desligamento();
			autorizacao_Desligamento.setData( aut_Desligamento.getData() );
			autorizacao_Desligamento.setDescricao( aut_Desligamento.getDescricao() );
			autorizacao_Desligamento.setAprovado( aut_Desligamento.isAprovado() );
			
			Usuario usuario = new Usuario();
			usuario.setLogin(aut_Desligamento.getUsuario().getLogin());
			
			autorizacao_Desligamento.setUsuario( usuario );
			aut_Desligamento_Aux.add(autorizacao_Desligamento);
		}
		
		//Finalizando conexao
		session.close();

		return aut_Desligamento_Aux;
	}
	
	@RequestMapping(value="aprovacao")
	public String aprovacao(Long id_Desligamento,
							Autorizacao autorizacao, @ModelAttribute("usuario_Logado") Usuario user)
	{

		//Iniciando conexao a abrindo uma transacao
		Session session = new HibernateUtil().getSession();
		session.beginTransaction();
		
		//Carrega o objeto desligamento a partir do nome
		GenericDao<Desligamento> daoDesligamento = new GenericDao<>(session, Desligamento.class);
		Desligamento desligamento = daoDesligamento.findById( id_Desligamento );
		
		//Incluindo a autorizacao
		Autorizacao_Desligamento aut_Desligamento = new Autorizacao_Desligamento();
		aut_Desligamento.setData(Calendar.getInstance());
		aut_Desligamento.setDescricao( autorizacao.getDescricao() );
		aut_Desligamento.setDesligamento( desligamento );
		aut_Desligamento.setNivel( user.getNivel_Autorizacao() );
		aut_Desligamento.setUsuario(user);
		
		GenericDao<Autorizacao_Desligamento> daoAut_Desligamento = new GenericDao<>(session, Autorizacao_Desligamento.class);
		
		if(autorizacao.isAprovado() == true)
		{
			/*
			 * Se o usuario for nivel=3, atualiza o atributo situacao do objeto funcionario
			 */
			if(user.getNivel_Autorizacao() == 3)
			{
				//Carrega o funcionario
				Funcionario funcionario = desligamento.getFuncionario();
				
				//Atualiza o objeto funcionario com situacao=Desligado
				funcionario.setSituacao("Desligado");
				
				GenericDao<Funcionario> daoFuncionario = new GenericDao<>(session, Funcionario.class);
				
				//Salava o objeto na session
				session = daoFuncionario.altera(funcionario);
			}
			
			aut_Desligamento.setAprovado(true);
		}
		
		/*Salvando objeto no session, comitando os dados no banco e
		 * finalizando a conexao
		*/
		session = daoAut_Desligamento.adiciona(aut_Desligamento);
		session.getTransaction().commit();
		session.close();
		
		return "redirect:lista";
		
	}

}
